/*
 * Classe ListFour
 *                          - Obtem os dados da lista 4 da base de dados (SQLite3 + ADO.NET) 
 * 							- Guarda esses dados numa Lista (C# Collections)
 * 							- Ordena os dados
 * 							- Escreve os resultados na consola e no ficheiro de texto respectivo
 *							- Tem como atributo o grau sobre o qual serão obtidos os dados
 *
 *@Author: Fábio Miguel Vitória Carreto - 5618 - Engenharia Informática - Diurno
 *@Version: 03/07/2011
 * 
 * 
 * */

using System;
using System.Collections.Generic;
using System.Data;
using Mono.Data.SqliteClient;
using System.IO;

public class ListFour
{
	
	public string grau;
	public ListFour (string grau)
	{
		this.grau = grau;
		
		//Para cada ano executa os seguintes métodos
		for(int ano = 0 ; ano < 10 ; ano++)
		{
			List<StructListFour> listFour = this.getData(ano);
			List<StructListFour> listOrdenada = this.mostraListaOrdenada(listFour);
			this.showResultsConsole(listOrdenada, ano);
			this.showResultsFile(listOrdenada, ano);	
		}

	}
	
	//Ordena os dados por ordem alfabética do nome de docente
	public List<StructListFour> mostraListaOrdenada(List<StructListFour> list)
	{
		list.Sort(delegate(StructListFour s1, StructListFour s2) { return s1.docente.CompareTo(s2.docente); });
		
		return list;
	}
	
	//Mostra resultados na consola
	public void showResultsConsole(List<StructListFour> list, int ano)
	{
		
		Console.WriteLine("ANO DE 200" + ano + "\nDOCENTES COM GRAU " + this.grau);
		Console.WriteLine("\nResultados (Ordenados por Ordem Alfabética em Cada Ano): \n");
		list.ForEach(delegate(StructListFour s) 
		{ 
			Console.WriteLine(s.docente); 
		});
		
	}
	
	//Mostra resultados no ficheiro respectivo
	public void showResultsFile(List<StructListFour> list, int ano)
	{
		string file = "Listas/listFour.txt";
		
		if(ano == 0)
		{
			
			TextWriter tw = new StreamWriter(file);
			tw.WriteLine(DateTime.Now);
			tw.WriteLine("Sistema Operativo: " + Environment.OSVersion.ToString());
			tw.WriteLine("");
			tw.WriteLine("Lista 4 - Docentes em cada ano com Grau " + this.grau);
			tw.WriteLine(Environment.NewLine + "(Resultados ordenados por ordem alfabética em cada ano)");
			tw.Close();
			
		}
		
		
		
		list.ForEach(delegate(StructListFour s) 
		{
			File.AppendAllText(file, String.Format("Ano = 200{0}, Grau = {1}, Docente = {2}" + 
			                                       Environment.NewLine, s.year, s.grau, s.docente));
		});
		
		File.AppendAllText(file, Environment.NewLine + Environment.NewLine);
		
		Console.WriteLine("\nOs resultados da lista 4 foram também guardados em ficheiro de texto.");
		Console.WriteLine("Localização: " + file);
		
	}
	
	//Obtém os dados da lista e retorna-os numa lista de objectos
	public List<StructListFour> getData(int ano)
	{
		string connectionString = "URI=file:rebides.db,version=3";
		IDbConnection dbcon;
		dbcon = (IDbConnection) new SqliteConnection(connectionString);
		dbcon.Open();
		IDbCommand dbcmd = dbcon.CreateCommand();
		
		List<StructListFour> list = new List<StructListFour>();
		IDataReader reader = null;
		
		//Obtem todos os docentes com o grau seleccionado pelo utilizador
		string sql = String.Format("SELECT DISTINCT nome FROM docente, registodocencia, grau " +
					 "WHERE docente.ano = {0} " +
					 "AND docente.id =  registodocencia.docente_id " +
					 "AND registodocencia.grau_id = grau.id " +
					 "AND grau.designacao = '{1}'", ano, this.grau);
		
		dbcmd.CommandText = sql;
		reader = dbcmd.ExecuteReader();
		
		while(reader.Read()) 
		{
			string docente = reader.GetString (0);
			//Para cada resultado cria um objecto StructListFour e guarda numa lista desses objectos
			list.Add(new StructListFour(ano, docente, this.grau));
		}
		
		
		return list;
		
	}
}

//Objecto que servirá de base à lista final
//Tem como atributos o ano, o nome do docente
//e o respectivo grau seleccionado pelo docente
public class StructListFour
{
	public int year;
	public string docente;
	public string grau;
	
	public StructListFour(int year, string docente, string grau)
	{
		this.year = year;
		this.docente = docente;
		this.grau = grau;
	}
}